package cn.edu.zsc.rbac.domain.dao.collection;

import cn.edu.zsc.rbac.domain.dao.IBaseDao;
import cn.edu.zsc.rbac.domain.entity.BaseEntity;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;


abstract class BaseDao<Entity extends BaseEntity> implements IBaseDao<Entity> {

    Map<Integer, Entity> data = new HashMap<>();


    private int idCounter = 1;

    @Override
    public boolean existsById(int id) {
        return data.containsKey(id);
    }

    @Override
    public Entity findById(int id) {
        return data.get(id);
    }

    //  修改 list 方法，排除已软删除的数据
    @Override
    public Collection<Entity> list() {
        return data.values().stream()
                .filter(entity -> !entity.isDeleted())
                .collect(Collectors.toList());
    }//该方法通过过滤掉已软删除的实体，
    // 确保只返回有效的、未被删除的数据。
    // 这在实现软删除功能时非常有用，可以避免将已删除的数据展示给用户。

    @Override
    public Entity save(Entity entity) {
        Integer id = entity.getId();
        if (id == null) {
            id = idCounter++;
            entity.setId(id);
        }
        data.put(id, entity);
        return entity;
    }

    @Override
    public Entity delete(int id) {
        return data.remove(id);
    }
    //新增软删除方法
    @Override
    public Entity softDelete(int id) {
        Entity entity = findById(id);
        if (entity != null) {
            entity.setDeleted(true);
            data.put(id, entity);     // 更新数据
        }
        return entity;
    }//如果实体没有 ID，则为其分配新的 ID 并保存；
    //如果已有 ID，则视为更新操作，直接覆盖原有数据；
    //使用内存中的 Map 模拟数据库行为，适合用于演示或测试环境。


        //新增恢复方法
    @Override
    public Entity restore(int id) {
        Entity entity = findById(id);
        if (entity != null) {
            entity.setDeleted(false);
            data.put(id, entity);
        }
        return entity;
    }
}
